骑士周游问题解决方案

#include<stdio.h>
#define used  0
#define unused 1


typedef int Boolean;
typedef struct Knight
{
int n;
Boolean tab;
}Knight;

//判断周边是否有能走的位置

Boolean isok(Knight (*knight)[8],int row,int col);

//运用递归使马走动

void move(Knight (*knight)[8],int row,int col);
void move(Knight (*knight)[8],int row,int col)
{
int mark,i,j;
int step=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(knight[i][j].tab==0)
step++;
}


}
if(step>=64)
{
return;
}
else
{
mark=isok(knight,row,col);
if(mark)
{
mark=isok(knight,row,col);
if(mark==1)
{
printf("%d->%d\n",knight[row][col].n,knight[row+1][col+2].n);

knight[row+1][col+2].tab=used;
move(knight,row+1,col+2);
}
mark=isok(knight,row,col);
if(mark==2)
{
printf("%d->%d\n",knight[row][col].n,knight[row+2][col+1].n);

knight[row+2][col+1].tab=used;
move(knight,row+2,col+1);
}
mark=isok(knight,row,col);
if(mark==3)
{
printf("%d->%d\n",knight[row][col].n,knight[row+2][col-1].n);

knight[row+2][col-1].tab=used;
move(knight,row+2,col-1);
}
mark=isok(knight,row,col);
if(mark==4)
{
printf("%d->%d\n",knight[row][col].n,knight[row+1][col-2].n);

knight[row+1][col-2].tab=used;
move(knight,row+1,col-2);
}
mark=isok(knight,row,col);
if(mark==5)
{
printf("%d->%d\n",knight[row][col].n,knight[row-1][col-2].n);

knight[row-1][col-2].tab=used;
move(knight,row-1,col-2);
}
mark=isok(knight,row,col);
if(mark==6)
{
printf("%d->%d\n",knight[row][col].n,knight[row-2][col-1].n);

knight[row-2][col-1].tab=used;
move(knight,row-2,col-1);
}
mark=isok(knight,row,col);
if(mark==7)
{
printf("%d->%d\n",knight[row][col].n,knight[row-2][col+1].n);

knight[row-2][col+1].tab=used;
move(knight,row-2,col+1);
}
mark=isok(knight,row,col);
if(mark==8)
{
printf("%d->%d\n",knight[row][col].n,knight[row-1][col+2].n);

knight[row-1][col+2].tab=used;
move(knight,row-1,col+2);
}
}


}
}
Boolean isok(Knight (*knight)[8],int row,int col)
{
int ok;
if(knight[row+1][col+2].tab &&row+1<8&&col+2<8)
{
ok=1;
}
else if(knight[row+2][col+1].tab&&row+2<8&&col+1<8)
{
ok=2;
}
else if(knight[row+2][col-1].tab&&row+2<8&&col-1>=0)
{
ok=3;
}
else if(knight[row+1][col-2].tab&&row+1<8&&col-2>=0)
{
ok=4;
}
else if(knight[row-1][col-2].tab&&row-1>=0&&col-2>=0)
{
ok=5;
}
else if(knight[row-2][col-1].tab&&row-2>=0&&col-1>=0)
{
ok=6;
}
else if(knight[row-2][col+1].tab&&row-2>=0&&col+1<8)
{
ok=7;
}
else if(knight[row-1][col+2].tab&&row-1>=0&&col+2<8)
{
ok=8;
}
else 
{
ok=0;
}
return ok;
}


int main()
{
Knight knight[8][8];
int i,j,k=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
knight[i][j].n=++k;
knight[i][j].tab=unused;
}


}
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%4d",knight[i][j].n);
}
printf("\n\n");


}
knight[0][0].tab=used;
move(knight,0,0);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%4d",knight[i][j].tab);
}
printf("\n\n");


}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值